package main

/**
尝试通过sync map + cond 使协程串行
*/

//func main() {
//	var smap sync.Map
//	var wg = sync.WaitGroup{}
//	var cond = sync.Cond{L: &sync.RWMutex{}}
//	wg.Add(2)
//
//	sum := 1
//	go func(s *sync.Map) {
//		cond.L.Lock()
//		fmt.Println("go1 启动了...")
//		defer wg.Done()
//		for true {
//			_, ok := s.Load("go2")
//			if ok {
//				fmt.Println("go2 store 结束了，go1开始执行")
//				break
//			} else {
//				fmt.Println("go2 未store，go1等待go2 store完毕")
//				cond.Wait()
//			}
//		}
//
//		fmt.Println("协程1应该后执行,sum:", sum+2) // 1+1+2 = 4
//		cond.L.Unlock()
//	}(&smap)
//
//	go func(s *sync.Map) {
//		fmt.Println("go2启动了...")
//		cond.L.Lock()
//		defer wg.Done()
//		fmt.Println("协程2应该先执行")
//		sum += 1
//		time.Sleep(time.Second * 2)
//		s.Store("go2", sum)
//		fmt.Println("协程2,sum:", sum)
//		cond.L.Unlock()
//		cond.Broadcast() // 唤醒协程1
//	}(&smap)
//
//	wg.Wait()
//
//}

/**
最终输出效果：
go2启动了...
go1 启动了...
go2 未store，go1等待go2 store完毕
协程2应该先执行
协程2,sum: 2
go2 store 结束了，go1开始执行
协程1应该后执行,sum: 4
*/
